import numpy as np


from keras import layers
import matplotlib.pyplot as plt
# 按顺序构成的模型
from keras.models import Sequential
from keras import optimizers

# 生成模拟数据
np.random.seed(0)
x_train = np.linspace(0, 10, 100).reshape(-1, 1)  # 假设这是一个单变量的线性关系
y_train = 2 * x_train + 3 + np.random.normal(0, 0.5, (100, 1))  # 真实模型 y = 2x + 3 加上一些噪声

# 构建Keras模型
model = Sequential([
    layers.Dense(1, input_shape=(1,), activation=None)  # 对于线性回归，不需要激活函数
])

# 编译模型
model.compile(loss='mean_squared_error',  # 使用均方误差作为损失函数
              optimizer=optimizers.Adam(),  # 选择优化器，这里是Adam
              metrics=['mse'])  # 定义评估指标，这里也是均方误差

# 训练模型
history = model.fit(x_train, y_train,  # 输入训练数据
                    epochs=500,  # 训练轮次
                    verbose=0,  # 控制输出信息，0表示静默模式
                    validation_split=0.2)  # 验证集占总数据的20%

# 评估模型
score = model.evaluate(x_train, y_train, verbose=0)
print(f'Mean Squared Error on training set: {score[0]}')

# 使用模型进行预测
predictions = model.predict(x_train)

# 可视化结果
plt.scatter(x_train, y_train, label='Actual Data')
plt.plot(x_train, predictions, color='r', linewidth=3, label='Predictions')
plt.xlabel('Input Feature')
plt.ylabel('Target Value')
plt.legend()
plt.show()
